home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / Kant Generator Pro 1.2 / src / Shell ƒ / dialogs.c < prev    next >
C/C++ Source or Header  |  1994-10-18  |  6KB  |  191 lines

  1. #include "dialogs.h"
  2. #include "main.h"
  3.  
  4. void PositionDialog(ResType theType, short theID)
  5. /* call this function BEFORE loading an alert or dialog box; this function will
  6.    load the alert/dialog into memory and position it centered horizontally and
  7.    positioned 1:3 vertically.  Then, load the alert/dialog right after the call
  8.    to PositionDialog, and the alert/dialog will be loaded from the copy in
  9.    memory, which has already been positioned correctly.  Cute, eh?  See error.c
  10.    for an example. */
  11. {
  12.     Handle                theTemplate;    /* Handle to resource template    */
  13.     register Rect        *theRect;        /* Bounding box of dialog        */
  14.     register short        left;            /* Left side of centered rect    */
  15.     register short        top;            /* Top side of centered rect    */
  16.     
  17.     /* The first field of the resource template for DLOG's and ALRT's */
  18.     /* is its bounding box.  Get a pointer to this rectangle.  This   */
  19.     /* handle dereferencing is safe since the remaining statements in */
  20.     /* this function do not move memory (assignment and simple math). */
  21.  
  22.     theTemplate = GetResource(theType, theID);
  23.     if (theTemplate == 0)
  24.         return;
  25.     theRect=(Rect*)*theTemplate;    /* bounding rectangle */
  26.     
  27.     left = (qd.screenBits.bounds.right - (theRect->right - theRect->left)) / 2;
  28.     top = (qd.screenBits.bounds.bottom - (theRect->bottom - theRect->top)) / 3;
  29.     if (top < (GetMBarHeight() + 1))    /* don't put it over menu bar */
  30.         top = GetMBarHeight() + 1;
  31.  
  32.     theRect->right += left - theRect->left;
  33.     theRect->left = left;
  34.     theRect->bottom += top - theRect->top;
  35.     theRect->top = top;
  36. }
  37.  
  38. pascal void OutlineDefaultButton(DialogPtr myDlog, short itemNum)
  39. /* Use this as the useritem for a dialog which needs an outlined default button. */
  40. /* Make sure the default button is item 1 in the DITL. */
  41. {
  42.     short            itemType;
  43.     Handle            itemH;
  44.     Rect            box;
  45.     
  46.     GetDItem(myDlog, 1, &itemType, &itemH, &box);
  47.     PenSize(3, 3);
  48.     InsetRect(&box, -4, -4);
  49.     FrameRoundRect(&box, 16, 16);
  50.     PenNormal();
  51. }
  52.  
  53. pascal Boolean OneButtonFilter(DialogPtr theDialog, EventRecord *theEvent, short *theItem)
  54. /* use this as the proc filter when calling ModalDialog -- it maps RETURN and
  55.    ENTER to button 1.  Of course, button 1 should be the OK button. */
  56. {
  57.     unsigned char    theChar;
  58.     
  59.     switch (theEvent->what)    /* examine event record */
  60.     {
  61.         case keyDown:    /* keypress */
  62.         case autoKey:
  63.             theChar=theEvent->message & charCodeMask;    /* get ascii char value */
  64.             if ((theChar==0x0d) || (theChar==0x03))        /* RETURN or ENTER */
  65.             {
  66.                 *theItem=FakeSelect(theDialog, 1);
  67.                 return TRUE;
  68.             }
  69.             break;
  70.         case updateEvt:
  71.             if ((theEvent->message)!=(unsigned long)theDialog)
  72.                 DispatchEvents(*theEvent, FALSE);
  73.             else
  74.                 OutlineDefaultButton(theDialog, 1);
  75.             break;
  76.     }
  77.     
  78.     return FALSE;    /* no faking, proceed as planned */
  79. }
  80.  
  81. pascal Boolean TwoButtonFilter(DialogPtr theDialog, EventRecord *theEvent, short *theItem)
  82. /* use this as the proc filter when calling ModalDialog -- it maps RETURN and
  83.    ENTER to button 1, and ESCAPE and COMMAND-PERIOD to button 2.  Of course,
  84.    button 1 should be the OK button and button 2 should be the cancel button. */
  85. {
  86.     unsigned char    theChar;
  87.     
  88.     switch (theEvent->what)    /* examine event record */
  89.     {
  90.         case keyDown:    /* keypress */
  91.         case autoKey:
  92.             theChar=theEvent->message & charCodeMask;    /* get ascii char value */
  93.             if ((theChar==0x0d) || (theChar==0x03))        /* RETURN or ENTER */
  94.             {
  95.                 *theItem=FakeSelect(theDialog, 1);
  96.                 return TRUE;
  97.             }
  98.             if ((theChar==0x1b) || (theChar=='`') ||    /* ESCAPE */
  99.                 ((theEvent->modifiers & cmdKey) && (theChar=='.')))    /* COMMAND-PERIOD */
  100.             {
  101.                 *theItem=FakeSelect(theDialog, 2);
  102.                 return TRUE;
  103.             }
  104.             break;
  105.         case updateEvt:
  106.             if ((theEvent->message)!=(unsigned long)theDialog)
  107.                 DispatchEvents(*theEvent, FALSE);
  108.             else
  109.                 OutlineDefaultButton(theDialog, 1);
  110.             break;
  111.     }
  112.     
  113.     return FALSE;    /* no faking, proceed as planned */
  114. }
  115.  
  116. pascal Boolean ThreeButtonFilter(DialogPtr theDialog, EventRecord *theEvent, short *theItem)
  117. /* use this as the proc filter when calling ModalDialog -- it maps RETURN and
  118.    ENTER to button 1, and ESCAPE and COMMAND-PERIOD to button 2, and command-D to
  119.    button 3.  (This is good for the "save document?" alert.  Of course,
  120.    button 1 should be the OK button and button 2 should be the cancel button. */
  121. {
  122.     unsigned char    theChar;
  123.     
  124.     switch (theEvent->what)    /* examine event record */
  125.     {
  126.         case keyDown:    /* keypress */
  127.         case autoKey:
  128.             theChar=theEvent->message & charCodeMask;    /* get ascii char value */
  129.             if ((theChar==0x0d) || (theChar==0x03))        /* RETURN or ENTER */
  130.             {
  131.                 *theItem=FakeSelect(theDialog, 1);
  132.                 return TRUE;
  133.             }
  134.             if ((theChar==0x1b) || (theChar=='`') ||    /* ESCAPE */
  135.                 ((theEvent->modifiers & cmdKey) && (theChar=='.')))    /* COMMAND-PERIOD */
  136.             {
  137.                 *theItem=FakeSelect(theDialog, 2);
  138.                 return TRUE;
  139.             }
  140.             if ((theEvent->modifiers & cmdKey) && ((theChar|0x20)=='d'))
  141.             {
  142.                 *theItem=FakeSelect(theDialog, 3);
  143.                 return TRUE;
  144.             }
  145.             break;
  146.         case updateEvt:
  147.             if ((theEvent->message)!=(unsigned long)theDialog)
  148.                 DispatchEvents(*theEvent, FALSE);
  149.             else
  150.                 OutlineDefaultButton(theDialog, 1);
  151.             break;
  152.     }
  153.     
  154.     return FALSE;    /* no faking, proceed as planned */
  155. }
  156.  
  157. short FakeSelect(DialogPtr theDialog, short itemNum)
  158. {
  159.     short            itemType;
  160.     Handle            itemH;
  161.     Rect            box;
  162.     long            dummy;
  163.     
  164.     GetDItem(theDialog, itemNum, &itemType, &itemH, &box);
  165.     HiliteControl((ControlHandle)itemH, 1);
  166.     Delay(8, &dummy);
  167.     HiliteControl((ControlHandle)itemH, 0);
  168.     
  169.     return itemNum;
  170. }
  171.  
  172. void SetButtonHighlight(DialogPtr theDialog, short itemNum, Boolean isOn)
  173. {
  174.     Rect            box;
  175.     short            itemType;
  176.     Handle            itemH;
  177.     
  178.     GetDItem(theDialog, itemNum, &itemType, &itemH, &box);
  179.     HiliteControl((ControlHandle)itemH, isOn ? 0 : 255);
  180. }
  181.  
  182. void SetButtonTitle(DialogPtr theDialog, short itemNum, Str255 theStr)
  183. {
  184.     Rect            box;
  185.     short            itemType;
  186.     Handle            itemH;
  187.     
  188.     GetDItem(theDialog, itemNum, &itemType, &itemH, &box);
  189.     SetCTitle((ControlHandle)itemH, theStr);
  190. }
  191.